//
//  Zombie.swift
//  Zombie
//
//  Created by 左忠飞 on 2021/8/4.
//

import Foundation

class Zombie:Monster {
    var walksWithLimp:Bool
    
    //计算类型属性
    //这个属性没有set方法,只读的
    //所以省略了get,直接返回所需的计算值
    class override var spookyNoise:String {
        return "Roar..."
    }
    
    //用static修饰的类的静态属性,子类不能覆盖
    //static let isTerrifying = false
    
    //外部不可写入的属性,外部可读,有一个internal的默认标注表示外部可读
    private(set) var isFallingApart:Bool
    
    //自定义指定初始化方法
    //子类的指定初始化方法必须调用父类的指定初始化方法
    //指定的初始化方法,需要先给自己的所有属性赋值,然后再调用父类的指定初始化方法
    init(limp:Bool,fallingApart:Bool,town:Town?,monsterName:String) {
        walksWithLimp = limp
        isFallingApart = fallingApart
        super.init(town: town, monsterName: monsterName)
    }
    
    //便捷初始化方法,不需要确保所有属性都赋值,只需要做完自己的工作后,把信息传递给其他的便捷初始化方法或指定初始化方法就可以
    //便捷初始化方法必须调用所在类型的其他初始化方法
    convenience init(limp:Bool,fallingApart:Bool) {
        self.init(limp: limp, fallingApart: fallingApart, town: nil, monsterName: "Fred")
        if walksWithLimp {
            print("This zombie has a bad knee")
        }
    }
    
    //父类规定了这个初始化方法必须实现,所有本类作为子类实现这个初始化方法
    //必须实现的初始化方法之前也必须要加required,但是不需要写override,required已经包含了这个意思
    //现在这个初始化方法是指定初始化方法:
    //因为:1:指定初始化方法负责初始化所有属性
    //    2:指定初始化方法调用父类的初始化方法
    //注意:现在这个类有两个指定初始化方法,这是没有问题的
    required init(town: Town?, monsterName: String) {
        walksWithLimp = false
        isFallingApart = false
        super.init(town: town, monsterName: monsterName)
    }
    
    //反初始化方法
    //在实例对象销毁之前会调用这个方法
    deinit {
        print("Zombie named \(name) is no longer with us.")
    }
    
    
    final override func terrorizeTown() {
        town?.changePopulation(by: -18)
        super.terrorizeTown()
    }
    
    
    override class func makeSpookNoise() -> String {
        return "Roar..."
    }
}
